﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BLLMagiPack.Managers;
using ModeloMagiPack.Entidades;

namespace MaGiPack.Movimientos
{
    public partial class FrmMovimiento : Form
    {
        private bool _esAlta;
        private Movimiento _movimiento;
        List<Cheque> _cheques;
        private int? _idCuentaBancaria;

        public FrmMovimiento(bool esBanco)
        {
            InitializeComponent();
            _movimiento = new Movimiento();
            _movimiento.EsBanco = esBanco;
            _esAlta = true;
            _cheques = new List<Cheque>();
            Text = "Nuevo movimiento";
            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Utilidades.Application_ThreadException);
        }

        public FrmMovimiento(Movimiento movimiento)
        {
            InitializeComponent();
            _movimiento = movimiento;
            _esAlta = false;
            _cheques = new List<Cheque>();
            Text = "Editando movimiento";
            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Utilidades.Application_ThreadException);
        }

        private void CargarCategorias()
        {
            BLLCategoria bll = new BLLCategoria();

            cboCategorias.Items.Clear();
            cboCategorias.Items.Add("-- Seleccione una opción --");

            foreach (Categoria categoria in bll.TraerCategorias().OrderBy(c => c.Nombre).ToList())
                cboCategorias.Items.Add(categoria);

            cboCategorias.SelectedIndex = 0;
        }

        private void CargarDatos()
        {
            txtMotivo.Text = _movimiento.Motivo;
            txtMonto.Text = _movimiento.Monto.ToString(Utilidades.Cultura);
            txtIVA.Text = _movimiento.PorcentajeIVA.ToString(Utilidades.Cultura);
            cboCategorias.Text = new BLLCategoria().TraerCategoria(_movimiento.IdCategoria).Nombre;
            dtpFecha.Value = _movimiento.Fecha;
            rdoIngreso.Checked = _movimiento.EsIngreso;
            rdoGasto.Checked = !rdoIngreso.Checked;
            chkIVADiscriminado.Checked = _movimiento.IVADiscriminado;
            chkIVADiscriminado.Visible = rdoGasto.Checked;
        }

        private bool ValidarDatos()
        {
            bool estaOK = true;
            Utilidades.LimpiarErrores(this, errorMovimiento);
            estaOK = Utilidades.ValidarDatos(this, errorMovimiento);

            return estaOK;
        }

        private void ConfigurarPorTipoMovimiento()
        {
            if (_movimiento.EsBanco)
            {
                gbCuentasBancarias.Visible = true;

                if (!_esAlta)
                {
                    _cheques = new BLLCheque().TraerChequesPorMovimiento(_movimiento.IdMovimiento);
                    bsCheques.DataSource = _cheques;

                    CuentaBancariaMovimiento asignacion = new BLLCuentaBancariaMovimiento().TraerPorMovimiento(_movimiento.IdMovimiento);

                    if (asignacion != null)
                    {
                        CuentaBancaria cuenta = new BLLCuentaBancaria().Traer(asignacion.IdCuentaBancaria);
                        _idCuentaBancaria = cuenta.IdCuentaBancaria;
                        Banco banco = new BLLBanco().TraerBanco(cuenta.IdBanco);
                        txtCuentaBancaria.Text = cuenta.Nombre + " - " + banco.NombreBanco;
                    }
                }
            }
            else
            {
                gbCheques.Visible = false;
                gbCuentasBancarias.Visible = false;
                txtCuentaBancaria.Tag = string.Empty;
                this.Width = 300;
            }
        }


        private void FrmMovimiento_Load(object sender, EventArgs e)
        {
            txtIVA.KeyPress += Utilidades.TextboxSoloEnteros_KeyPress;
            txtIVA.Text = Utilidades.IVA.ToString();
            ConfigurarPorTipoMovimiento();
            CargarCategorias();

            if (!_esAlta)
                CargarDatos();
        }

        private void rdoGasto_CheckedChanged(object sender, EventArgs e)
        {
            chkIVADiscriminado.Visible = rdoGasto.Checked;
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            if (ValidarDatos())
            {
                _movimiento.EsIngreso = rdoIngreso.Checked;
                _movimiento.Fecha = dtpFecha.Value.Date;
                _movimiento.IdCategoria = (cboCategorias.SelectedItem as Categoria).IdCategoria;
                _movimiento.Monto = decimal.Parse(txtMonto.Text, Utilidades.Cultura);
                _movimiento.PorcentajeIVA = int.Parse(txtIVA.Text);
                _movimiento.Motivo = txtMotivo.Text;
                _movimiento.IVADiscriminado = chkIVADiscriminado.Checked;

                BLLMovimiento bll = new BLLMovimiento();

                if (_esAlta)
                    bll.CargarNuevo(_movimiento, _idCuentaBancaria, _cheques);
                else
                    bll.ModificarMovimiento(_movimiento, _idCuentaBancaria, _cheques);

                Close();
            }
        }

        private void btnABMCategorias_Click(object sender, EventArgs e)
        {
            FrmCategorias frmCategorias = new FrmCategorias();
            frmCategorias.ShowDialog();
            CargarCategorias();
        }


        #region Sección Cheques

        private void dgvChequesAsignados_SelectionChanged(object sender, EventArgs e)
        {
            btnRemover.Enabled = dgvChequesAsignados.SelectedRows.Count > 0;
        }

        private void btnRemover_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewRow fila in dgvChequesAsignados.SelectedRows)
            {
                int idCheque = (int) fila.Cells[0].Value;
                _cheques.Remove(_cheques.Where(c => c.IdCheque == idCheque).First());
            }

            bsCheques.DataSource = null;
            bsCheques.DataSource = _cheques;
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            FrmCheques frmCheques = new FrmCheques(true);

            if (frmCheques.ShowDialog() == DialogResult.OK)
            {    
                _cheques.Add(frmCheques.ChequeSeleccionado);
                bsCheques.DataSource = null;
                bsCheques.DataSource = _cheques;
            }
        }

        #endregion

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            FrmCuentaBancaria cuentas = new FrmCuentaBancaria(true);

            if (cuentas.ShowDialog() == DialogResult.OK)
            {
                CuentaBancaria cuenta = cuentas.CuentaBancariaSeleccionada;
                _idCuentaBancaria = cuenta.IdCuentaBancaria;

                Banco banco = new BLLBanco().TraerBanco(cuenta.IdBanco);
                txtCuentaBancaria.Text = cuenta.Nombre + " - " + banco.NombreBanco;
            }
        }
    }
}
